<%

function getMd5(ByVal str)
	if str = "" then
		getMd5 = ""
		exit function
	end if
	dim cj_md5
	set cj_md5 = new md5Model
		getMd5 = cj_md5.MD5(str)
	set cj_md5 = nothing
end function

'MD5
class md5Model
	private BITS_TO_A_BYTE
	private BYTES_TO_A_WORD
	private BITS_TO_A_WORD
	private m_lOnBits(30)
	private m_l2Power(30)
	private function LShift(lValue, iShiftBits)
		if iShiftBits = 0 then
			LShift = lValue
			exit function
		elseif iShiftBits = 31 then
			if lValue and 1 then
				LShift = &H80000000
			else
				LShift = 0
			end if
			exit function
		elseif iShiftBits < 0 or iShiftBits > 31 then
			err.Raise 6
		end if
		if (lValue and m_l2Power(31 - iShiftBits)) then
			LShift = ((lValue and m_lOnBits(31 - (iShiftBits + 1))) * m_l2Power(iShiftBits)) or &H80000000
		else
			LShift = ((lValue and m_lOnBits(31 - iShiftBits)) * m_l2Power(iShiftBits))
		end if
	end function
	private function str2bin(varstr)
		dim varasc, i, varchar, varlow, varhigh
		str2bin = ""
		for i = 1 to len(varstr)
			varchar = mid(varstr, i, 1)
			varasc = asc(varchar)
			if varasc < 0 then varasc = varasc + 65535
			if varasc > 255 then
				varlow = left(hex(asc(varchar)), 2)
				varhigh = right(hex(asc(varchar)), 2)
				str2bin = str2bin & chrb("&H" & varlow) & chrb("&H" & varhigh)
			else
				str2bin = str2bin & chrb(ascb(varchar))
			end if
		next
	end function
	private function RShift(lValue, iShiftBits)
		if iShiftBits = 0 then
			RShift = lValue
			exit function
		elseif iShiftBits = 31 then
			if lValue and &H80000000 then
				RShift = 1
			else
				RShift = 0
			end if
			exit function
		elseif iShiftBits < 0 or iShiftBits > 31 then
			err.Raise 6
		end if
		RShift = (lValue and &H7FFFFFFE) \ m_l2Power(iShiftBits)
		if (lValue and &H80000000) then
			RShift = (RShift or (&H40000000 \ m_l2Power(iShiftBits - 1)))
		end if
	end function
	private function RotateLeft(lValue, iShiftBits)
		RotateLeft = LShift(lValue, iShiftBits) or RShift(lValue, (32 - iShiftBits))
	end function
	private function AddUnsigned(lX, lY)
		dim lX4, lY4, lX8, lY8, lResult
		lX8 = lX and &H80000000
		lY8 = lY and &H80000000
		lX4 = lX and &H40000000
		lY4 = lY and &H40000000
		lResult = (lX and &H3FFFFFFF) + (lY and &H3FFFFFFF)
		if lX4 and lY4 then
			lResult = lResult Xor &H80000000 Xor lX8 Xor lY8
		elseif lX4 or lY4 then
			if lResult and &H40000000 then
				lResult = lResult Xor &HC0000000 Xor lX8 Xor lY8
			else
				lResult = lResult Xor &H40000000 Xor lX8 Xor lY8
			end if
		else
			lResult = lResult Xor lX8 Xor lY8
		end if
		AddUnsigned = lResult
	end function
	private function md5_F(x, y, z)
		md5_F = (x and y) or ((Not x) and z)
	end function
	private function md5_G(x, y, z)
		md5_G = (x and z) or (y and (Not z))
	end function
	private function md5_H(x, y, z)
		md5_H = (x Xor y Xor z)
	end function
	private function md5_I(x, y, z)
		md5_I = (y Xor (x or (Not z)))
	end function
	private sub md5_FF(a, b, c, d, x, s, ac)
		a = AddUnsigned(a, AddUnsigned(AddUnsigned(md5_F(b, c, d), x), ac))
		a = RotateLeft(a, s)
		a = AddUnsigned(a, b)
	End sub
	private sub md5_GG(a, b, c, d, x, s, ac)
		a = AddUnsigned(a, AddUnsigned(AddUnsigned(md5_G(b, c, d), x), ac))
		a = RotateLeft(a, s)
		a = AddUnsigned(a, b)
	End sub
	private sub md5_HH(a, b, c, d, x, s, ac)
		a = AddUnsigned(a, AddUnsigned(AddUnsigned(md5_H(b, c, d), x), ac))
		a = RotateLeft(a, s)
		a = AddUnsigned(a, b)
	End sub
	private sub md5_II(a, b, c, d, x, s, ac)
		a = AddUnsigned(a, AddUnsigned(AddUnsigned(md5_I(b, c, d), x), ac))
		a = RotateLeft(a, s)
		a = AddUnsigned(a, b)
	End sub
	private function ConvertToWordArray(smessage)
		dim lmessageLength, lNumberOfWords, lWordArray(), lBytePosition, lByteCount, lwordCount
		Const MODULUS_BITS = 512, CONGRUENT_BITS = 448, BITS_TO_A_BYTE = 8, BYTES_TO_A_WORD = 4, BITS_TO_A_WORD = 32
		lmessageLength = LenB(smessage)
		lNumberOfWords = (((lmessageLength + ((MODULUS_BITS - CONGRUENT_BITS) \ BITS_TO_A_BYTE)) \ (MODULUS_BITS \ BITS_TO_A_BYTE)) + 1) * (MODULUS_BITS \ BITS_TO_A_WORD)
		redim lWordArray(lNumberOfWords - 1)
		lBytePosition = 0
		lByteCount = 0
		do until lByteCount >= lmessageLength
			lwordCount = lByteCount \ BYTES_TO_A_WORD
			lBytePosition = (lByteCount mod BYTES_TO_A_WORD) * BITS_TO_A_BYTE
			lWordArray(lwordCount) = lWordArray(lwordCount) or LShift(ascb(MidB(smessage, lByteCount + 1, 1)), lBytePosition)
			lByteCount = lByteCount + 1
		loop
		lwordCount = lByteCount \ BYTES_TO_A_WORD
		lBytePosition = (lByteCount mod BYTES_TO_A_WORD) * BITS_TO_A_BYTE
		lWordArray(lwordCount) = lWordArray(lwordCount) or LShift(&H80, lBytePosition)
		lWordArray(lNumberOfWords - 2) = LShift(lmessageLength, 3)
		lWordArray(lNumberOfWords - 1) = RShift(lmessageLength, 29)
		ConvertToWordArray = lWordArray
	end function
	private function WordToHex(lValue)
		Const BITS_TO_A_BYTE = 8, BYTES_TO_A_WORD = 4, BITS_TO_A_WORD = 32
		dim lByte, lCount
		for lCount = 0 to 3
			lByte = RShift(lValue, lCount * BITS_TO_A_BYTE) and m_lOnBits(BITS_TO_A_BYTE - 1)
			WordToHex = WordToHex & right("0" & hex(lByte), 2)
		next
	end function
	public function MD5(smessage)
		m_lOnBits(0) = clng(1)
		m_lOnBits(1) = clng(3)
		m_lOnBits(2) = clng(7)
		m_lOnBits(3) = clng(15)
		m_lOnBits(4) = clng(31)
		m_lOnBits(5) = clng(63)
		m_lOnBits(6) = clng(127)
		m_lOnBits(7) = clng(255)
		m_lOnBits(8) = clng(511)
		m_lOnBits(9) = clng(1023)
		m_lOnBits(10) = clng(2047)
		m_lOnBits(11) = clng(4095)
		m_lOnBits(12) = clng(8191)
		m_lOnBits(13) = clng(16383)
		m_lOnBits(14) = clng(32767)
		m_lOnBits(15) = clng(65535)
		m_lOnBits(16) = clng(131071)
		m_lOnBits(17) = clng(262143)
		m_lOnBits(18) = clng(524287)
		m_lOnBits(19) = clng(1048575)
		m_lOnBits(20) = clng(2097151)
		m_lOnBits(21) = clng(4194303)
		m_lOnBits(22) = clng(8388607)
		m_lOnBits(23) = clng(16777215)
		m_lOnBits(24) = clng(33554431)
		m_lOnBits(25) = clng(67108863)
		m_lOnBits(26) = clng(134217727)
		m_lOnBits(27) = clng(268435455)
		m_lOnBits(28) = clng(536870911)
		m_lOnBits(29) = clng(1073741823)
		m_lOnBits(30) = clng(2147483647)
		m_l2Power(0) = clng(1)
		m_l2Power(1) = clng(2)
		m_l2Power(2) = clng(4)
		m_l2Power(3) = clng(8)
		m_l2Power(4) = clng(16)
		m_l2Power(5) = clng(32)
		m_l2Power(6) = clng(64)
		m_l2Power(7) = clng(128)
		m_l2Power(8) = clng(256)
		m_l2Power(9) = clng(512)
		m_l2Power(10) = clng(1024)
		m_l2Power(11) = clng(2048)
		m_l2Power(12) = clng(4096)
		m_l2Power(13) = clng(8192)
		m_l2Power(14) = clng(16384)
		m_l2Power(15) = clng(32768)
		m_l2Power(16) = clng(65536)
		m_l2Power(17) = clng(131072)
		m_l2Power(18) = clng(262144)
		m_l2Power(19) = clng(524288)
		m_l2Power(20) = clng(1048576)
		m_l2Power(21) = clng(2097152)
		m_l2Power(22) = clng(4194304)
		m_l2Power(23) = clng(8388608)
		m_l2Power(24) = clng(16777216)
		m_l2Power(25) = clng(33554432)
		m_l2Power(26) = clng(67108864)
		m_l2Power(27) = clng(134217728)
		m_l2Power(28) = clng(268435456)
		m_l2Power(29) = clng(536870912)
		m_l2Power(30) = clng(1073741824)
		dim x, k, AA, BB, CC, DD, a, b, c, d
		Const S11 = 7, S12 = 12, S13 = 17, S14 = 22, S21 = 5, S22 = 9, S23 = 14, S24 = 20
		Const S31 = 4, S32 = 11, S33 = 16, S34 = 23, S41 = 6, S42 = 10, S43 = 15, S44 = 21
		x = ConvertToWordArray(str2bin(smessage))
		a = &H67452301
		b = &HEFCDAB89
		c = &H98BADCFE
		d = &H10325476
		for k = 0 to ubound(x) Step 16
			AA = a
			BB = b
			CC = c
			DD = d
			md5_FF a, b, c, d, x(k + 0), S11, &HD76AA478
			md5_FF d, a, b, c, x(k + 1), S12, &HE8C7B756
			md5_FF c, d, a, b, x(k + 2), S13, &H242070DB
			md5_FF b, c, d, a, x(k + 3), S14, &HC1BDCEEE
			md5_FF a, b, c, d, x(k + 4), S11, &HF57C0FAF
			md5_FF d, a, b, c, x(k + 5), S12, &H4787C62A
			md5_FF c, d, a, b, x(k + 6), S13, &HA8304613
			md5_FF b, c, d, a, x(k + 7), S14, &HFD469501
			md5_FF a, b, c, d, x(k + 8), S11, &H698098D8
			md5_FF d, a, b, c, x(k + 9), S12, &H8B44F7AF
			md5_FF c, d, a, b, x(k + 10), S13, &HFFFF5BB1
			md5_FF b, c, d, a, x(k + 11), S14, &H895CD7BE
			md5_FF a, b, c, d, x(k + 12), S11, &H6B901122
			md5_FF d, a, b, c, x(k + 13), S12, &HFD987193
			md5_FF c, d, a, b, x(k + 14), S13, &HA679438E
			md5_FF b, c, d, a, x(k + 15), S14, &H49B40821
			md5_GG a, b, c, d, x(k + 1), S21, &HF61E2562
			md5_GG d, a, b, c, x(k + 6), S22, &HC040B340
			md5_GG c, d, a, b, x(k + 11), S23, &H265E5A51
			md5_GG b, c, d, a, x(k + 0), S24, &HE9B6C7AA
			md5_GG a, b, c, d, x(k + 5), S21, &HD62F105D
			md5_GG d, a, b, c, x(k + 10), S22, &H2441453
			md5_GG c, d, a, b, x(k + 15), S23, &HD8A1E681
			md5_GG b, c, d, a, x(k + 4), S24, &HE7D3FBC8
			md5_GG a, b, c, d, x(k + 9), S21, &H21E1CDE6
			md5_GG d, a, b, c, x(k + 14), S22, &HC33707D6
			md5_GG c, d, a, b, x(k + 3), S23, &HF4D50D87
			md5_GG b, c, d, a, x(k + 8), S24, &H455A14ED
			md5_GG a, b, c, d, x(k + 13), S21, &HA9E3E905
			md5_GG d, a, b, c, x(k + 2), S22, &HFCEFA3F8
			md5_GG c, d, a, b, x(k + 7), S23, &H676F02D9
			md5_GG b, c, d, a, x(k + 12), S24, &H8D2A4C8A
			md5_HH a, b, c, d, x(k + 5), S31, &HFFFA3942
			md5_HH d, a, b, c, x(k + 8), S32, &H8771F681
			md5_HH c, d, a, b, x(k + 11), S33, &H6D9D6122
			md5_HH b, c, d, a, x(k + 14), S34, &HFDE5380C
			md5_HH a, b, c, d, x(k + 1), S31, &HA4BEEA44
			md5_HH d, a, b, c, x(k + 4), S32, &H4BDECFA9
			md5_HH c, d, a, b, x(k + 7), S33, &HF6BB4B60
			md5_HH b, c, d, a, x(k + 10), S34, &HBEBFBC70
			md5_HH a, b, c, d, x(k + 13), S31, &H289B7EC6
			md5_HH d, a, b, c, x(k + 0), S32, &HEAA127FA
			md5_HH c, d, a, b, x(k + 3), S33, &HD4EF3085
			md5_HH b, c, d, a, x(k + 6), S34, &H4881D05
			md5_HH a, b, c, d, x(k + 9), S31, &HD9D4D039
			md5_HH d, a, b, c, x(k + 12), S32, &HE6DB99E5
			md5_HH c, d, a, b, x(k + 15), S33, &H1FA27CF8
			md5_HH b, c, d, a, x(k + 2), S34, &HC4AC5665
			md5_II a, b, c, d, x(k + 0), S41, &HF4292244
			md5_II d, a, b, c, x(k + 7), S42, &H432AFF97
			md5_II c, d, a, b, x(k + 14), S43, &HAB9423A7
			md5_II b, c, d, a, x(k + 5), S44, &HFC93A039
			md5_II a, b, c, d, x(k + 12), S41, &H655B59C3
			md5_II d, a, b, c, x(k + 3), S42, &H8F0CCC92
			md5_II c, d, a, b, x(k + 10), S43, &HFFEFF47D
			md5_II b, c, d, a, x(k + 1), S44, &H85845DD1
			md5_II a, b, c, d, x(k + 8), S41, &H6FA87E4F
			md5_II d, a, b, c, x(k + 15), S42, &HFE2CE6E0
			md5_II c, d, a, b, x(k + 6), S43, &HA3014314
			md5_II b, c, d, a, x(k + 13), S44, &H4E0811A1
			md5_II a, b, c, d, x(k + 4), S41, &HF7537E82
			md5_II d, a, b, c, x(k + 11), S42, &HBD3AF235
			md5_II c, d, a, b, x(k + 2), S43, &H2AD7D2BB
			md5_II b, c, d, a, x(k + 9), S44, &HEB86D391
			a = AddUnsigned(a, AA)
			b = AddUnsigned(b, BB)
			c = AddUnsigned(c, CC)
			d = AddUnsigned(d, DD)
		next
		MD5 = lcase(WordToHex(a) & WordToHex(b) & WordToHex(c) & WordToHex(d))
	end function
end class
'Md5结束
%>